﻿// CA.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
	std::cout << "Hello World!\n";

	std::string mp = R"(C:\Users\17373\Desktop\1.jpg)";

	cv::Mat img = cv::imread(mp);

	if (img.empty())
	{
		std::cout << "could not load image...\n";
		return -1;
	}

	cv::cvtColor(img, img, cv::COLOR_BGR2GRAY);

	long pixValue = 0;
	for (int i = 0; i < img.rows; i++)
	{
		for (int j = 0; j < img.cols; j++)
		{
			pixValue += img.at<uchar>(i, j);
		}
	}

	double avg = pixValue / (img.rows * img.cols * 1.0);
	int thesh = 25;

	cv::Mat m = img.clone();

	for (int i = 0; i < img.rows; i++)
	{
		for (int j = 0; j < img.cols; j++)
		{
			if (std::pow(std::abs(img.at<uchar>(i, j) - avg), 2) > std::pow(thesh, 2))
			{
				m.at<uchar>(i, j) = 255;
			}
			else
			{
				m.at<uchar>(i, j) = 0;
			}
		}
	}

	cv::Mat t = 255 - m;

	std::vector<std::vector<cv::Point>> contours;
	std::vector<cv::Vec4i> hierarchy;
	findContours(t, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);

	// 绘制轮廓
	cv::Mat drawing = cv::Mat::zeros(t.size(), CV_8UC3);
	for (size_t i = 0; i < contours.size(); i++) {
		// 为不同轮廓分配随机颜色
		cv::Scalar color = cv::Scalar(rand() % 256, rand() % 256, rand() % 256);
		drawContours(drawing, contours, (int)i, color, 2, cv::LINE_8, hierarchy, 0);
	}
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
